/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.smartitengineering.generator.engine.webservice.resource;
import com.smartitengineering.generator.engine.service.ReportFilter;
import com.smartitengineering.generator.engine.webservice.domain.ReportConfig;
import com.smartitengineering.generator.engine.service.factory.Services;
import com.smartitengineering.generator.engine.webservice.adapter.ReportConfigAdapterHelper;
import com.smartitengineering.util.bean.adapter.GenericAdapterImpl;
import com.smartitengineering.util.rest.atom.server.AbstractResource;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriBuilderException;
import org.apache.abdera.model.Feed;
import org.apache.abdera.model.Link;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
/**
*
* @author saumitra
*/
public class ReportConfigResource extends AbstractResource {
public static final String PATH_NEW_REPORT = "new-report";
@PathParam("id")
private String id;
@Context
private HttpServletRequest servletRequest;
private GenericAdapterImpl<ReportConfig, com.smartitengineering.generator.engine.domain.ReportConfig> adapter;
private final com.smartitengineering.generator.engine.domain.ReportConfig persistentReportConfig;
private static final Method CONFIG_CONTENT;
static {
try {
CONFIG_CONTENT = ReportConfigResource.class.getMethod("getConfig");
}
catch (Exception ex) {
throw new InstantiationError();
}
}
public ReportConfigResource(@PathParam("id") String id) {
persistentReportConfig = Services.getInstance().getReportConfigService().getById(id);
adapter = new GenericAdapterImpl<ReportConfig, com.smartitengineering.generator.engine.domain.ReportConfig>();
adapter.setHelper(new ReportConfigAdapterHelper());
}
@GET
@Produces(MediaType.APPLICATION_ATOM_XML)
public Response get() {
ResponseBuilder responseBuilder = Response.status(Status.OK);
if (persistentReportConfig == null) {
return Response.status(Status.NOT_FOUND).build();
}
Feed configFeed = getConfigFeed();
responseBuilder = Response.ok(configFeed);
return responseBuilder.build();
}
private Feed getConfigFeed() throws UriBuilderException, IllegalArgumentException {
Feed configFeed = getFeed(persistentReportConfig.getId(), new Date());
configFeed.setTitle(persistentReportConfig.getName());
// add a self link
configFeed.addLink(getSelfLink());
// add a edit link
Link editLink = getAbderaFactory().newLink();
editLink.setHref(getUriInfo().getRequestUri().toString());
editLink.setRel(Link.REL_EDIT);
editLink.setMimeType(MediaType.APPLICATION_JSON);
configFeed.addLink(editLink);
configFeed.addLink(getLink(getRelativeURIBuilder().path(getUriInfo().getPath()).path(PATH_NEW_REPORT).build(id),
PATH_NEW_REPORT, MediaType.APPLICATION_FORM_URLENCODED));
// add a alternate link
Link altLink = getAbderaFactory().newLink();
altLink.setHref(getRelativeURIBuilder().path(RootResource.CONFIGS).path(ReportConfigsResource.CONFIG).path(
CONFIG_CONTENT).build(persistentReportConfig.getId()).toASCIIString());
altLink.setRel(Link.REL_ALTERNATE);
altLink.setMimeType(MediaType.APPLICATION_JSON);
configFeed.addLink(altLink);
//TODO add link to its reports
return configFeed;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/content")
public Response getConfig() {
ResponseBuilder responseBuilder = Response.ok(adapter.convertInversely(persistentReportConfig));
return responseBuilder.build();
}
@GET
@Produces(MediaType.TEXT_HTML)
public Response getHtml() {
ResponseBuilder responseBuilder = Response.status(Status.OK);
return responseBuilder.build();
}
@POST
@Path(PATH_NEW_REPORT)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response scheduleReport(@FormParam("schedule") String schedule) {
Date scheduleDate = null;
ResponseBuilder responseBuilder = null;
if (StringUtils.isNotBlank(schedule)) {
try {
scheduleDate = DateUtils.parseDate(schedule, new String[]{DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.
getPattern()});
}
catch (Exception ex) {
responseBuilder = Response.status(Status.BAD_REQUEST);
}
}
if (responseBuilder == null) {
try {
Services.getInstance().getReportConfigService().scheduleReport(persistentReportConfig, scheduleDate);
responseBuilder = Response.status(Status.OK);
}
catch (Exception ex) {
responseBuilder = Response.status(Status.INTERNAL_SERVER_ERROR);
}
}
return responseBuilder.build();
}
@POST
@Path("/delete")
public Response deletePost(ReportConfig reportConfig) {
com.smartitengineering.generator.engine.domain.ReportConfig persistentConfig = adapter.convert(reportConfig);
try {
Services.getInstance().getReportConfigService().delete(persistentConfig);
}
catch (Exception ex) {
servletRequest.setAttribute("error", ex);
}
ResponseBuilder responseBuilder = Response.status(Status.OK);
return responseBuilder.build();
}
@DELETE
public Response delete() {
Services.getInstance().getReportConfigService().delete(persistentReportConfig);
ResponseBuilder responseBuilder = Response.status(Status.OK);
return responseBuilder.build();
}
@PUT
@Produces(MediaType.APPLICATION_ATOM_XML)
@Consumes(MediaType.APPLICATION_JSON)
public Response update(ReportConfig reportConfig) {
com.smartitengineering.generator.engine.domain.ReportConfig persistentConfig = adapter.convert(reportConfig);
ResponseBuilder responseBuilder = Response.status(Status.OK);
try {
basicUpdate(persistentConfig);
responseBuilder = Response.ok(getConfigFeed());
}
catch (Exception ex) {
responseBuilder = Response.status(Status.INTERNAL_SERVER_ERROR);
}
return responseBuilder.build();
}
@POST
@Path("/update")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response updatePost(@HeaderParam("Content-type") String contentType, String message) {
ResponseBuilder responseBuilder = Response.ok();
if (StringUtils.isBlank(message)) {
responseBuilder = Response.status(Status.BAD_REQUEST);
responseBuilder.build();
}
try {
//Will search for the first '=' if not found will take the whole string
final int startIndex = 0;//message.indexOf("=") + 1;
//Consider the first '=' as the start of a value point and take rest as value
final String realMsg = message.substring(startIndex);
//Decode the message to ignore the form encodings and make them human readable
message = URLDecoder.decode(realMsg, "UTF-8");
}
catch (UnsupportedEncodingException ex) {
System.out.println(ex);
}
return responseBuilder.build();
}
@Path(RootResource.REPORTS)
public ReportsResource getReportsForThisConfig() {
final ReportFilter filter = new ReportFilter();
filter.setConfigId(id);
final ReportsResource reportsResource = getResourceContext().getResource(ReportsResource.class);
reportsResource.setReportFilter(filter);
return reportsResource;
}
private void basicUpdate(com.smartitengineering.generator.engine.domain.ReportConfig persistentConfig) {
Services.getInstance().getReportConfigService().update(persistentConfig);
}
@Override
protected String getAuthor() {
return "Smart Generator";
}
}